package com.carbon.gate.filter;

// Token认证相关import已移除
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;

/**
 * 自定义过滤器
 * @author : Li Jun
 * @since : 2021-06-12 08:52
 **/
@Slf4j
@Component
public class MyZuulFilter extends ZuulFilter {

    // Token认证已移除

    /**
     * 定义过滤器类型
     *      pre     ：   在执行路由请求之前执行
     *      routing ：   在路由请求是调用
     *      post    ：   在routing和error过滤器之后执行
     *      error   ：   处理请求出现异常的时候执行
     * @return  返回过滤器类型
     */
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }


    /**
     * 定义过滤器的优先级    ：   数字越小,优先级越高
     * @return  过滤器的优先级
     */
    @Override
    public int filterOrder() {
        return 0;
    }


    /**
     * 判断过滤器是否需要执行
     * @return  过滤器是否需要执行
     */
    @Override
    public boolean shouldFilter() {
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String url = request.getRequestURI();
        String method = request.getMethod();
        log.info("=== 网关过滤器处理请求 ===");
        log.info("请求方法: {}", method);
        log.info("请求URL: {}", request.getRequestURL());
        log.info("请求URI: {}", url);
        log.info("请求参数: {}", request.getQueryString());
        ArrayList<String> notFilterUrls = new ArrayList<>();
        // 认证相关接口 - 按照接口文档格式
        notFilterUrls.add("/auth");
        notFilterUrls.add("/auth/login");
        notFilterUrls.add("/auth/register");
        notFilterUrls.add("/auth/verify");
        notFilterUrls.add("/auth/verify/");
        notFilterUrls.add("/auth/refresh");
        notFilterUrls.add("/auth/logout");
        notFilterUrls.add("/auth/forgotPassword");
        // 其他白名单接口
        notFilterUrls.add("/assets/carbonInformation/getRandomList");
        notFilterUrls.add("/assets/carbonInformation/add");
        notFilterUrls.add("/system/feishu");
        notFilterUrls.add("/system/feishu/approval/callback");
        notFilterUrls.add("/system/sysAccount/renew/email");
        notFilterUrls.add("/system/carbonH5Article/getPageList");
        notFilterUrls.add("/system/weTaskFissionReward/activeComplete");
        // 临时测试接口 - 开发环境使用
        notFilterUrls.add("/system/sysRole/getPageList");
        notFilterUrls.add("/system/sysRole/add");
        notFilterUrls.add("/assets/carbonArticle/getPageList");
        // 系统管理相关接口
        notFilterUrls.add("/system/sysAccount/add");
        notFilterUrls.add("/system/sysDict/getPageList");
        notFilterUrls.add("/system/sysDict/add");
        notFilterUrls.add("/system/sysDict/getAllDict");
        notFilterUrls.add("/system/sysMenu/list");
        notFilterUrls.add("/system/sysMenu/add");
        // 系统服务内部调用接口
        notFilterUrls.add("/system/sysAccount/add");
        notFilterUrls.add("/system/sysAccount/update");
        notFilterUrls.add("/system/sysAccount/list");
        notFilterUrls.add("/system/sysAccount/getPageList");
        notFilterUrls.add("/assets/exchangeAccount/uploadCredential");
        notFilterUrls.add("/assets/es/");
        notFilterUrls.add("/assets/change/");
        notFilterUrls.add("/cmall/");
        notFilterUrls.add("/bmall/");
//        notFilterUrls.add("/system/");
//        notFilterUrls.add("/pad/");

        //swagger 文档
        notFilterUrls.add("/system/v2/api-docs");
        notFilterUrls.add("/assets/v2/api-docs");
        notFilterUrls.add("/trade/v2/api-docs");
        notFilterUrls.add("/authCenter/v2/api-docs");
        notFilterUrls.add("/workbench/v2/api-docs");
        notFilterUrls.add("/cmall/v2/api-docs");
        notFilterUrls.add("/bmall/v2/api-docs");
        for (String notFilterUrl : notFilterUrls) {
            // 清理URL中的特殊字符
            String cleanUrl = url.replaceAll("[\\r\\n\\t]", "").trim();
            // 支持精确匹配和前缀匹配
            if (cleanUrl.equals(notFilterUrl) || cleanUrl.startsWith(notFilterUrl + "/")) {
                log.info("Not_Filter_Url: {} matches pattern: {}", cleanUrl, notFilterUrl);
                return false;
            }
        }

        return true;
    }

    /**
     * 过滤器中负责的具体业务逻辑
     * @return  返回NULL,继续向后执行
     * @throws ZuulException 异常
     */
    @Override
    public Object run() throws ZuulException {
        log.info("=== 执行网关过滤器业务逻辑 ===");
        
        //获取Zuul提供的请求上下文对象
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        
        log.info("过滤器处理请求: {} {}", request.getMethod(), request.getRequestURI());

        // option请求，直接放行
        if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
            log.info("OPTIONS请求，直接放行");
            return null;
        }

        // Token认证已移除，直接放行所有请求
        log.info("Token认证已移除，直接放行请求: {}", request.getRequestURI());

        //校验通过，可以考虑把用户信息放入上下文，继续向后执行
        return null;
    }
}
